package com.itxh.mybatis.model;

import com.itxh.mybatis.utils.GenericTokenParser;

/**
 * DynamicSqlSource会封装配置文件中SQL文本包含${}或者动态标签的内容
 *
 * 获取SQL语句的时机：每一次调用getBoundSql都需要重新处理动态SQL
 */
public class DynamicSqlSource implements SqlSource{
    private SqlNode mixedSqlNode;

    public DynamicSqlSource(SqlNode mixedSqlNode) {
        this.mixedSqlNode = mixedSqlNode;
    }

    @Override
    public BoundSql getBoundSql(Object param) {
        // 先获取到所有的SqlNode
        DynamicContext context = new DynamicContext(param);
        // 解析SqlNode(解析动态标签以及${})
        mixedSqlNode.apply(context);

        // 再单独解析#{}
        ParameterMappingTokenHandler tokenHandler = new ParameterMappingTokenHandler();
        GenericTokenParser tokenParser = new GenericTokenParser("#{","}",tokenHandler);
        String sql = tokenParser.parse(context.getSql());
        // 最后将解析出来的SQL语句和对应的参数映射信息封装到BoundSql返回
        return new BoundSql(sql,tokenHandler.getParameterMappings());
    }
}
